/*
 * @Author: 0x9DEFA478
 * @Date: 2021-10-09 17:45:41
 * @LastEditTime: 2021-10-11 00:35:36
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef __IC_Mifare1_H_
#define __IC_Mifare1_H_
#include "H_Type.h"





typedef struct{
  Hbyte* SerialNumber;
  int SerialNumberLength;
  Hbyte SAK;
  Huint16 ATQA;
}IC_Mifare1_CommunicationCallback_Param;

typedef struct{
  
  void* v;//底层句柄


  //必须实现

  int (*Reset)(void*);//复位底层
  int (*Transmit)(void*,Hbyte*,Hbyte,int);//发送数据 (底层句柄,发送数据,发送位长度,最大等待时间)
  int (*Receive)(void*,Hbyte*,Hbyte,Hbyte*,int);//接收数据 (底层句柄,接收数据,最大接收位长度,接收位长度,最大等待时间)
  int (*Transceive)(void*,Hbyte*,Hbyte,Hbyte*,Hbyte,Hbyte*,int);//发送接收数据 (底层句柄,发送数据,发送位长度,接收数据,最大接收位长度,接收位长度,最大等待时间)
  int (*MFAuthent)(void*,Hbyte*,Hbyte,int,Hbyte*);//三轮认证 密钥认证 (底层句柄,卡ID,块地址,密钥)
  

  //可选实现(如果不需要 固定返回vIC_Mifare1_Result_Ok)

  int (*CallBeforeProbeCard)(void*);//在卡检测之前被调用
  int (*CallAfterHaltCard)(void*);//在卡操作完成之后被调用

  int (*BspIsValid)(void*);//底层有效性检查 返回vIC_Mifare1_Result_Ok表明底层硬件有效 否则底层硬件无效

}IC_Mifare1_LL_Function;


typedef struct _IC_Mifare1{

  int Status;//状态

  IC_Mifare1_CommunicationCallback_Param* Param;//只有在CommunicationCallback中有效

  IC_Mifare1_LL_Function LL_Function;//底层方法

}IC_Mifare1;


#define vIC_Mifare1_Result_NoCard                                  1            //无响应 未发现卡
#define vIC_Mifare1_Result_Ok                                      0            //操作无错误
#define vIC_Mifare1_Result_Error                                   -1           //出现错误 此情况下IC通信已经无法继续下去且无法恢复，需要复位后再次尝试通信
#define vIC_Mifare1_Result_StatusError                             -2           //状态错误 调用了在某些状态下不能调用的方法

#define vIC_Mifare1_Status_Select                                  1            //卡选中状态
#define vIC_Mifare1_Status_Ready                                   0            //卡已准备好识别
#define vIC_Mifare1_Status_CommunicationError                      -1           //通信错误
#define vIC_Mifare1_Status_BspInvaild                              -2           //底层无效

#define vIC_Mifare1_AuthentType_A                                  1
#define vIC_Mifare1_AuthentType_B                                  2

#define vIC_Mifare1_ValueBlockGetValue_Value_Msk                   0x0FU        
#define vIC_Mifare1_ValueBlockGetValue_Value_Ok                    0x00U        //数值完全正确
#define vIC_Mifare1_ValueBlockGetValue_Value_PartOk                0x01U        //数值部分正确, 能解析出数值
#define vIC_Mifare1_ValueBlockGetValue_Value_Error                 0x02U        //数值错误过多, 没有解析出数值
#define vIC_Mifare1_ValueBlockGetValue_Addr_Msk                    0xF0U        
#define vIC_Mifare1_ValueBlockGetValue_Addr_Ok                     0x00U        //地址完全正确
#define vIC_Mifare1_ValueBlockGetValue_Addr_PartOk                 0x10U        //地址部分正确, 能解析出地址
#define vIC_Mifare1_ValueBlockGetValue_Addr_Error                  0x20U        //地址错误过多, 没有解析出地址











//============================================================================================================================================
//
// 提供给外部的方法
//
//============================================================================================================================================

/**
 * @brief 初始化IC_Mifare1控制器
 * @param _this 未使用的句柄
 * @param LL_Function 底层方法集合
 * @return 无
 */
void IC_Mifare1_Init(IC_Mifare1* _this,IC_Mifare1_LL_Function* LL_Function);

/**
 * @brief 尝试进行一次卡操作 如果寻卡成功CommunicationCallback被调用 此后卡被halt
 * @param _this IC_Mifare1句柄
 * @param CommunicationCallback IC_Mifare1句柄
 * @param IsAll 0:仅选中空闲的卡 其他:所有卡都在选中范围
 * @return 0: CommunicationCallback成功被调用 其他:CommunicationCallback没有被调用
 */
int IC_Mifare1_Communication(IC_Mifare1* _this,void (*CommunicationCallback)(IC_Mifare1*,IC_Mifare1_CommunicationCallback_Param*),int IsAll);

//============================================================================================================================================
//
// 提供给外部的方法 在IC_Mifare1_Communication()传入的CommunicationCallback()中调用
//
//============================================================================================================================================

/**
 * @brief 密钥验证
 * @param _this IC_Mifare1句柄
 * @param BlockAddr 要验证的块地址
 * @param AuthentType 密码类型 要验证的密码类型 vIC_Mifare1_AuthentType_A与vIC_Mifare1_AuthentType_B可选
 * @param Password 密钥
 * @return 返回执行结果
 */
int IC_Mifare1_Authent(IC_Mifare1* _this,Hbyte BlockAddr,int AuthentType,Hbyte* Password);

/**
 * @brief 读一个块
 * @param _this IC_Mifare1句柄
 * @param BlockAddr 块地址
 * @param Dst 指向用于存放数据的内存 大小16字节
 * @return 返回执行结果
 */
int IC_Mifare1_ReadBlock(IC_Mifare1* _this,Hbyte BlockAddr,Hbyte* Dst);

/**
 * @brief 写一个块
 * @param _this IC_Mifare1句柄
 * @param BlockAddr 块地址
 * @param SrcData 要写入的数据 大小16字节
 * @return 返回执行结果
 */
int IC_Mifare1_WriteBlock(IC_Mifare1* _this,Hbyte BlockAddr,Hbyte* SrcData);

/**
 * @brief 数值块操作 数值块内的值 增加/减小/不加不减 到IC卡的数值缓冲区
 * @param _this IC_Mifare1句柄
 * @param BlockAddr IC_Mifare1句柄
 * @param IsDecrement 如果dValue不为0, 则该段有效: 0:加值 其他:减值
 * @param dValue 变化的值 如果为0 则使用Restore指令, 值不做变化的转到IC卡的数值缓冲区
 * @return 返回执行结果
 */
int IC_Mifare1_ValueOperation(IC_Mifare1* _this,Hbyte BlockAddr,int IsDecrement,Huint32 dValue);

/**
 * @brief 数值块操作 将IC卡的数值缓冲区的数值存储到块中
 * @param _this IC_Mifare1句柄
 * @param BlockAddr 要存储到的块地址
 * @return 返回执行结果
 */
int IC_Mifare1_ValueTransfer(IC_Mifare1* _this,Hbyte BlockAddr);

//============================================================================================================================================
//
// 附加给外部的方法 无调用条件 随便调用
//
//============================================================================================================================================

/**
 * @brief 生成数组块数据
 * @param BlockData 生成的数据存放位置
 * @param BlockAddr 块地址
 * @param Value 数值
 * @return 无
 */
void IC_Mifare1_MakeValueBlock(Hbyte* BlockData,Hbyte BlockAddr,Huint32 Value);

/**
 * @brief 简单解析并获取块的数值和地址域的地址 (有更好的恢复方法(只是恢复概率更高) 但这个函数没有使用 其实也没什么必要)
 * @param BlockData 块数据
 * @param BlockAddr 用于返回地址域的地址
 * @param Value 用于返回数值
 * @return 结果有效性
 */
Hbyte IC_Mifare1_ValueBlockGetValue(Hbyte* BlockData,Hbyte* BlockAddr,Huint32* Value);



#endif //__IC_Mifare1_H_
